from . import passport_blue
# 导入request
from flask import request, jsonify, current_app, make_response
# 导入状态码
from info.utils.response_code import RET

from info.utils.captcha.captcha import captcha
# 导入redis数据库实例和常量
from info import redis_stroe, constants

from info.libs.yuntongxun.sms import CCP

import re
import random


@passport_blue.route('/img_uuid')
def generate_img_code():
    """
    1、前端生成uuid验证码，将其发送给服务器
    2、判断参数是否存在
    3、根据captcha生成图片验证码的，name，text，
    4、将验证码存到redis中
    5、返回图片验证码
    :return:
    """
    img_uuid = request.args.get("img_uuid")

    if not img_uuid:
        return jsonify(errno=RET.PARAMERR, errargs="验证码参数错误")

    name, text, img = captcha.generate_captcha()
    try:
        redis_stroe.setex("img_code_" + img_uuid, constants.IMAGE_CODE_REDIS_EXPIRES, text)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errargs="数据库存储错误")
    else:
        response = make_response(img)
        # 将相应头信息改成Content-type = "image/jpg"
        response.headers["Content-Type"] = "image/jpg"
        return response


@passport_blue.route("/message_code", methods=["POST"])
def massage():
    """
    1、接收前端发送过来的三个参数
    2、判断三个参数的完整性
    3、判断手机号码格式
    4、拼接redis的名字并从redis中获取img_uuid
    5、对比两个数据的相同性
    6、生成六位数的随机数
    7、将这六位的随机数保存到redis中
    8、使用云通讯给手机发送验证码
    :return:
    """
    mobile = request.json.get("mobile")
    # uuid编码
    img_uuid = request.json.get("imageCodeId")
    # 用户输入的验证码
    img_code = request.json.get("img_code")

    if not all([mobile, img_uuid, img_code]):
        return jsonify(errno=RET.PARAMERR, errargs="接受参数错误")

    if not re.match(r'^1[3456789]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errargs="手机号码格式错误")

    try:
        real_code = redis_stroe.get("img_code_" + img_uuid)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errargs="数据库获取失败")

    if not real_code:
        return jsonify(errno=RET.NODATA, errargs="图片验证码已过期")

    try:
        redis_stroe.delete("img_code_" + img_uuid)
    except Exception as e:
        current_app.logger.error(e)

    if img_code.lower() != real_code.lower():
        return jsonify(errno=RET.DBERR, errargs="验证码不一致")

    mobile_code = '%06d' % random.randint(0, 999999)

    redis_stroe.setex("mobile_code" + mobile, constants.SMS_CODE_REDIS_EXPIRES, mobile_code)

    try:
        ccp = CCP()
        result = ccp.send_template_sms(mobile, [mobile_code, constants.SMS_CODE_REDIS_EXPIRES / 60], 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errargs="发送短信异常")

    if not result:
        return jsonify(errno=RET.OK, errargs="发送信息成功")
    else:
        return jsonify(errno=RET.THIRDERR, errargs="发送信息失败")
